package com.java.base.exercise.limitrate;

import org.apache.dubbo.rpc.cluster.Router;

/**
 * @Author RenPu
 * @Date 2023/3/17 15:46
 * @Version 1.0
 * @Description:基于漏铜完成限流的实现
 *              优点：是由队列进行实现的，过多的请求会存储在队列里进行缓冲
 *              缺点：请求的下发都是匀速执行的，既然服务没有任何负载的情况下
 **/
public class LeakBucketLimiter {

    //其实时间刻度
   private static long timeStamp=System.currentTimeMillis();

    //漏桶的大小
    private static int bucketSize=10;

    //漏水的匀速为
    private static int rate=3;

    //当前的水量
    private static long count=0;

    public static boolean grand(){
        //1:获取时间范围内需要流出的总水量
        long now = System.currentTimeMillis();
       long out =(now-timeStamp)*rate;
        //先执行漏水，计算剩余的水量
         count= Math.max(0, count - out);
          timeStamp=now;
          if((count+1)<bucketSize){
              count++;
              return true;
        }else {

              //水满拒绝加水
              return false;
          }


    }


    public static void main(String[] args) {


        for (int i = 0; i <100 ; i++) {
            new Thread(()->{
                if(grand()){
                    System.out.println("开始执行业务处理########################");
                }else {

                    System.out.println("进入限流机制=================");
                }



            }).start();

        }



    }









}
